package pe.com.astech.web.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;

import pe.com.astech.web.bean.DetalleOrdenPedido;
import pe.com.astech.web.bean.OrdenPedidoBean;
import pe.com.astech.web.bean.OrdenTrabajoBean;
import pe.com.astech.web.dao.OrdenPedidoDao;
import pe.com.astech.web.exception.DBException;
import pe.com.astech.web.util.Constantes;

@Repository
public class OrdenPedidoDaoImpl implements OrdenPedidoDao {

	private JdbcTemplate jdbcTemplate;

	private static final Log log = LogFactory.getLog(OrdenPedidoDaoImpl.class);
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public List<OrdenPedidoBean> buscarOrdenPedido(String mensajeTrazabilidad,
			String nroOrden){
		String query = "select op.id_orden_pedido,op.nro_orden,op.fecha,op.ruta_documento,op.cliente_ID,c.razon_social "
				+ "from orden_pedido op "
				+ "inner join cliente c on c.id_cliente=op.cliente_ID "
				+ "where op.nro_orden like :nroOrden";

		List<OrdenPedidoBean> list = new ArrayList<OrdenPedidoBean>();
		log.info("query : " + query);
		
		MapSqlParameterSource parameters = new MapSqlParameterSource();
	 	parameters.addValue("nroOrden", "%"+nroOrden+"%");
	 	
	 	NamedParameterJdbcTemplate namedParameterJdbcTemplate= new NamedParameterJdbcTemplate(jdbcTemplate);
		List<Map<String, Object>> usrRows = namedParameterJdbcTemplate.queryForList(query,parameters);

			for (Map<String, Object> usrRow : usrRows) {

				OrdenPedidoBean ordenPedidoBean = new OrdenPedidoBean();
				ordenPedidoBean.setId_orden_pedido(String.valueOf(usrRow
						.get("id_orden_pedido")));
				ordenPedidoBean.setNro_orden(String.valueOf(usrRow
						.get("nro_orden")));
				ordenPedidoBean.setFecha(String.valueOf(usrRow.get("fecha")));
				ordenPedidoBean.setRuta_documento(String.valueOf(usrRow
						.get("ruta_documento")));
				ordenPedidoBean.setCliente_ID(String.valueOf(usrRow
						.get("cliente_ID")));
				ordenPedidoBean.setRazon_social(String.valueOf(usrRow
						.get("razon_social")));

				list.add(ordenPedidoBean);
				log.info(mensajeTrazabilidad + " id_orden_pedido "
						+ usrRow.get("id_orden_pedido"));
			}
		return list;
	}

	@Override
	public List<OrdenPedidoBean> obtenerPedidosProceso(String mensajeTrazabilidad){
		String query = "select op.cliente_ID,op.fecha,op.id_orden_pedido,op.nro_orden,c.razon_social,dop.cantidad,dop.maquinaria_ID, " + 
						"tm.modelo,tm.nombre " +
				        "from orden_pedido op " +
						"inner join detalle_orden_pedido dop on dop.orden_pedido_ID=op.id_orden_pedido " +
						"inner join cliente c on op.cliente_ID=c.id_cliente " +
						"inner join maquinaria tm on tm.id_maquinaria=dop.maquinaria_ID " +
						"where op.estado=:estado";
		
		List<OrdenPedidoBean> list = new ArrayList<OrdenPedidoBean>();
		log.info("query : " + query);

		MapSqlParameterSource parameters = new MapSqlParameterSource();
	 	parameters.addValue("estado", Constantes.ESTADO_OP_PROCESO);
		
	 	NamedParameterJdbcTemplate namedParameterJdbcTemplate= new NamedParameterJdbcTemplate(jdbcTemplate);
		List<Map<String, Object>> usrRows = namedParameterJdbcTemplate.queryForList(query,parameters);
			
			for (Map<String, Object> usrRow : usrRows) {

				OrdenPedidoBean ordenPedidoBean = new OrdenPedidoBean();
				
				ordenPedidoBean.setCliente_ID(String.valueOf(usrRow
						.get("cliente_ID")));
				ordenPedidoBean.setFecha(String.valueOf(usrRow.get("fecha")));
				ordenPedidoBean.setId_orden_pedido(String.valueOf(usrRow.get("id_orden_pedido")));
				ordenPedidoBean.setNro_orden(String.valueOf(usrRow.get("nro_orden")));
				ordenPedidoBean.setRazon_social(String.valueOf(usrRow
						.get("razon_social")));
				ordenPedidoBean.setCantidad(String.valueOf(usrRow
						.get("cantidad")));
				ordenPedidoBean.setMaquinaria_ID(String.valueOf(usrRow
						.get("maquinaria_ID")));
				ordenPedidoBean.setNombre_maquinaria(String.valueOf(usrRow
						.get("nombre")));
				ordenPedidoBean.setModelo_maquinaria(String.valueOf(usrRow
						.get("modelo")));

				list.add(ordenPedidoBean);
				log.info(mensajeTrazabilidad + " id_orden_pedido "
						+ usrRow.get("id_orden_pedido"));
			}

		return list;
	}

	@Override
	public List<DetalleOrdenPedido> obtenerDetallePedidosProceso(
			String mensajeTrazabilidad) {
		String query = "select dop.orden_pedido_ID,dop.maquinaria_ID,dop.cantidad from orden_trabajo ot " +
						"inner join detalle_orden_pedido dop on dop.orden_pedido_ID=ot.orden_pedido_ID and dop.maquinaria_ID=ot.maquinaria_ID " +
						"inner join orden_pedido op on op.id_orden_pedido = dop.orden_pedido_ID " +
						"where op.estado=:estado";
				
				List<DetalleOrdenPedido> list = new ArrayList<DetalleOrdenPedido>();
				log.info("query : " + query);
				
				MapSqlParameterSource parameters = new MapSqlParameterSource();
					parameters.addValue("estado", Constantes.ESTADO_OP_PROCESO);
				
					NamedParameterJdbcTemplate namedParameterJdbcTemplate= new NamedParameterJdbcTemplate(jdbcTemplate);
					List<Map<String, Object>> usrRows = namedParameterJdbcTemplate.queryForList(query,parameters);
					
					for (Map<String, Object> usrRow : usrRows) {
				
						DetalleOrdenPedido detalleOrdenPedido = new DetalleOrdenPedido();
						
						detalleOrdenPedido.setOrden_pedido_ID(String.valueOf(usrRow
								.get("orden_pedido_ID")));
						detalleOrdenPedido.setMaquinaria_ID(String.valueOf(usrRow.get("Maquinaria_ID")));
						detalleOrdenPedido.setCantidad(String.valueOf(usrRow.get("cantidad")));
						
						list.add(detalleOrdenPedido);
						log.info(mensajeTrazabilidad + " orden_pedido_ID "
								+ usrRow.get("orden_pedido_ID"));
					}
				
				return list;
	}

}
